package http_server

import (
	"html/template"
	"net/http"
	"path"
)

// createStateHandler 静态资源处理函数
func (group *RouterGroup) createStateHandler(relativePath string, fs http.FileSystem) HandlerFunc {
	absolutePath := path.Join(group.prefix, relativePath) // 拼接完整的路径，group.prefix：是分组路由前缀
	// 使用StripPrefix处理`absolutePath`开头的请求
	fileServer := http.StripPrefix(absolutePath, http.FileServer(fs)) // 去掉前缀路径，然后交给http.FileServer处理
	return func(ctx *Context) {
		file := ctx.Param("filepath") // 提取路径参数
		// 校验文件是否存在或是否有权限访问
		if _, err := fs.Open(file); err != nil {
			ctx.W.WriteHeader(http.StatusNotFound)
			ctx.W.Write([]byte("404 NOT FOUND: " + file))
			return
		} else {
			// 访问静态资源文件
			fileServer.ServeHTTP(ctx.W, ctx.R) // 调用fileServer的ServeHTTP方法处理请求

		}

	}
}

// Static 静态资源处理函数暴露给外部使用
func (group *RouterGroup) Static(relativePath string, root string) {
	handler := group.createStateHandler(relativePath, http.Dir(root))
	urlPattern := path.Join(relativePath, "/*filepath") // 捕获任意路径参数
	group.GET(urlPattern, handler)                      // 使用GET方法注册处理函数
}

// SetFuncMap 自定义渲染函数
func (engine *Engine) SetFuncMap(funcMap template.FuncMap) {
	engine.funcMap = funcMap

}

// LoadHTMLGlob 加载模板函数
func (engine *Engine) LoadHTMLGlob(pattern string) {
	engine.htmlTemplates = template.Must(template.New("").Funcs(engine.funcMap).ParseGlob(pattern)) // 加载模板文件
}
